/*************************************************************************
                           Robot  -  description
                             -------------------
    début                : 19 févr. 2012
    copyright            : (C) 2012 par francois
*************************************************************************/

//---------- Interface de la classe <Robot> (fichier Robot.h) ------
#if ! defined ( ROBOT_H_ )
#define ROBOT_H_

//--------------------------------------------------- Interfaces utilisées
#include "Geometry/Point2D.h"
#include <math.h>

namespace livia {
//------------------------------------------------------------- Constantes 

//------------------------------------------------------------------ Types 

//------------------------------------------------------------------------ 
// Rôle de la classe <Robot>
//
// Classe modélisant la position du robot dans la carte.
//------------------------------------------------------------------------ 

class Robot
{
//----------------------------------------------------------------- PUBLIC

public:
// ------------------------------------------------------------ Constantes
	static const int WIDTH = 56; // axe X
	static const int HEIGHT = 23; // axe Y
	static const int DEPTH = 23;// axe Z
	static const float FOV = 70* (M_PI / 180); // Field of view of the robot
	static const float MAX_VIEW = 1000; // Le robot peut voir jusqu'à un mètre
	static const float MAX_RADIUS = 10.0f; // Rayon maximal pour les zones crossables

//----------------------------------------------------- Méthodes publiques
	void rotate(float dAngle);
	// Fait une rotation de <dAngle> radians dans le sens trigonométrique

	void setAngle(float angle);
	// affecte l'angle <angle> au robot

	float getAngle() const { return angle; }
	// Retourne l'angle actuel du robot par rapport à l'axe Y

	void setPosition(float x, float y);
	// affecte la nouvelle position du robot, sur les deux axes

	void setX(float x);
	// affecte la nouvelle position en x du robot

	void setY(float y);
	// affecte la nouvelle position en y du robot

	void move (float distance);
	// Avance de <distance> unitées dans la direction courante

	float getX() const { return position.getX(); }
	// Retourne la position courante du robot sur l'axe des abscisses

	float getY() const { return position.getY(); }
	// Retourne la position courante du robot sur l'axe des ordonnées

	livgeo::Point2D& getPosition() { return position; }

//------------------------------------------------- Surcharge d'opérateurs

//-------------------------------------------- Constructeurs - destructeur

    Robot (float x, float y, float angle);
    // Constructeur

    virtual ~Robot ( );
    // Destructeur

//------------------------------------------------------------------ PRIVE 

protected:
//----------------------------------------------------- Méthodes protégées

//----------------------------------------------------- Attributs protégés

    livgeo::Point2D position;
    // position en Y dans le référentiel de la carte. Vaut une unitée
    float angle; // axe (Y,vecteur) - En radian

};

//--------------------------- Autres définitions dépendantes de <Robot>


}; // ----- Fin de namespace livia
#endif // ROBOT_H_
